{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](http://osloyi5le.bkt.clouddn.com/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%B7%A5%E7%A8%8B%E5%B8%88banner.png)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 线性回归示例\n",
    "\n",
    "- [熟悉numpy](#熟悉numpy)\n",
    "- [单变量线性回归](#单变量线性回归)\n",
    "- [梯度下降](#梯度下降)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Library/Python/2.7/site-packages/matplotlib/font_manager.py:273: UserWarning: Matplotlib is building the font cache using fc-list. This may take a moment.\n",
      "  warnings.warn('Matplotlib is building the font cache using fc-list. This may take a moment.')\n",
      "/Library/Python/2.7/site-packages/IPython/html.py:14: ShimWarning: The `IPython.html` package has been deprecated. You should import from `notebook` instead. `IPython.html.widgets` has moved to `ipywidgets`.\n",
      "  \"`IPython.html.widgets` has moved to `ipywidgets`.\", ShimWarning)\n"
     ]
    }
   ],
   "source": [
    "# %load ../../standard_import.txt\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from mpl_toolkits.mplot3d import axes3d\n",
    "\n",
    "pd.set_option('display.notebook_repr_html', False)\n",
    "pd.set_option('display.max_columns', None)\n",
    "pd.set_option('display.max_rows', 150)\n",
    "pd.set_option('display.max_seq_items', None)\n",
    " \n",
    "#%config InlineBackend.figure_formats = {'pdf',}\n",
    "%matplotlib inline  \n",
    "\n",
    "import seaborn as sns\n",
    "sns.set_context('notebook')\n",
    "sns.set_style('white')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 熟悉numpy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def warmUpExercise():\n",
    "    return(np.identity(5))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  0.,  0.,  0.,  0.],\n",
       "       [ 0.,  1.,  0.,  0.,  0.],\n",
       "       [ 0.,  0.,  1.,  0.,  0.],\n",
       "       [ 0.,  0.,  0.,  1.,  0.],\n",
       "       [ 0.,  0.,  0.,  0.,  1.]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "warmUpExercise()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 单变量线性回归"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "data = np.loadtxt('linear_regression_data1.txt', delimiter=',')\n",
    "\n",
    "X = np.c_[np.ones(data.shape[0]),data[:,0]]\n",
    "y = np.c_[data[:,1]]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFkCAYAAADmPNjoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl4VFWe//FPJWGNIqiAG4QWxA1B22jjtIEoodkCJCzS\nDKEJixN8ArI1a4AKICBKCxij4miPIjba8MMAKtqNkuVpcaB1ZFXHR+gEEALYY4cExSz398e1kspW\nqSy13Kr363l8krq13FOJ5FPn3HO+x2YYhiEAAGAJIb5uAAAAcB/BDQCAhRDcAABYCMENAICFENwA\nAFgIwQ0AgIWEefLFy8rKtHjxYp04cUIhISFatmyZmjdvrgULFigkJES33HKL7Ha7J5sAAEBA8Whw\nf/TRR7LZbNqyZYv279+vZ555RoZhaPbs2YqMjJTdbteePXsUExPjyWYAABAwPDpUHhMToxUrVkiS\nvv32W1111VU6duyYIiMjJUl9+vTRvn37PNkEAAACikd73JIUEhKihQsX6q9//as2bNigv/3tb+X3\nhYeH6+LFiy6f/+OPP+rIkSNq3769QkNDPd1cAAB8rrS0VOfPn1ePHj3UsmXLSvd5PLglafXq1fr9\n73+vUaNG6fLly+XHi4qK1KZNG5fPPXLkiMaNG+fpJgIA4HfeeOON8lFqB48Gd0ZGhvLz85WUlKQW\nLVooJCREPXr00P79+3X//fcrOztbvXv3dvka7du3l2Q2/rrrrvNkcwEA8Atnz57VuHHjyjPQmUeD\ne+DAgVqwYIESEhJUUlKixYsX6+abb9bixYtVXFysrl27auDAgS5fwzE8ft111+mmm27yZHMBAPAr\nNV0i9mhwt2zZUuvXr692/PXXX/fkaQEACFgUYAEAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4A\nACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAs\nhOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITg\nBgDAQghuAAAshOAGAMBCCG4AACyE4AYAwEIIbgAALITgBgDAQghuAAAshOAGAMBCCG4AACwkzJMv\nXlJSokWLFun06dMqLi7W1KlTdf311yspKUldunSRJI0dO1aDBg3yZDMAAAgYHg3unTt3ql27dnrq\n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\nQv4/qZEOuw5wRmEAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x109f91ed0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,1], y, s=30, c='r', marker='x', linewidths=1)\n",
    "plt.xlim(4,24)\n",
    "plt.xlabel('Population of City in 10,000s')\n",
    "plt.ylabel('Profit in $10,000s');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### 梯度下降"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 计算损失函数\n",
    "def computeCost(X, y, theta=[[0],[0]]):\n",
    "    m = y.size\n",
    "    J = 0\n",
    "    \n",
    "    h = X.dot(theta)\n",
    "    \n",
    "    J = 1.0/(2*m)*(np.sum(np.square(h-y)))\n",
    "    \n",
    "    return J"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "32.072733877455676"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "computeCost(X,y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 梯度下降\n",
    "def gradientDescent(X, y, theta=[[0],[0]], alpha=0.01, num_iters=1500):\n",
    "    m = y.size\n",
    "    J_history = np.zeros(num_iters)\n",
    "    \n",
    "    for iter in np.arange(num_iters):\n",
    "        h = X.dot(theta)\n",
    "        theta = theta - alpha*(1.0/m)*(X.T.dot(h-y))\n",
    "        J_history[iter] = computeCost(X, y, theta)\n",
    "    return(theta, J_history)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "('theta: ', array([-3.63029144,  1.16636235]))\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n2TJ16dLlivfNJwL/p3PvW61WuVwuL1b0y9SoUUMhISGy2+16+OGH9cgjj8g4axqE0NBQ2e125eXl\nndPfkJCQSz5rwNvOfnZCeZ/O/m/ky30rl52drW3btunll1/W5MmTNW7cuGrTx4SEBBUVFemWW27R\n008/raFDh1aL383f/OY358zMebl9Kl9vs9nO2beq+Wn/atWqJak0PN577z3dc8895/399NX+uVwu\nTZw4UU8++aRq1KhRsY+v9u+n/+2OHDmiiIgIvf3224qNjdXs2bOveN98IvBtNpvy8vIq3rtcLpnN\nPlH6eY4dO6bhw4frzjvvVFJS0jn9KH+mwC951oC3LVq0SGvWrNHQoUO1c+dOjR8//pzPlXy5b+Ui\nIiLUrVs3Wa1WxcfHKygo6IJ98cU+/vOf/1THjh31v//9Tx988IHGjx+vkpKSiu2+3LezufP/29l/\nd346KKjKli9frmeeeUazZ89WZGRktelfenq6Dh48qMmTJ+uxxx7T7t279dxzz1Wb/kVERKhnz56S\npF69emnbtm0KCwu7on3zidTs2LGjVq5cKUnavHmzmjVr5uWKfpmTJ09q5MiRevzxx3XnnXdKklq0\naFHxaOCvvvpKCQkJatOmjTZu3Kji4mLl5uZq7969atq0qTdLv6R3331Xc+fO1dy5c9W8eXNNnz5d\n3bp1qxZ9K5eQkKBVq1ZJkk6cOKGCggJ16dJFGzZskOTbfczPz684YggLC5PD4VDLli2rRd/O1rJl\ny8v+nezQoUPF352VK1f6xNTe//3vfzVv3jzNnTtX9evXlyS1bdvW5/tnGIbatGmjpUuXas6cOXrp\npZfUpEkTTZgwoVr0Tyr9+1Jeb1pampo2bXrFfzcrZS79X+s3v/mN1qxZU3FV5nPPPeflin6ZWbNm\nKScnR6+99ppeffVVmUwmPfXUU3r22WdVUlKixo0b65ZbbpHJZNLQoUM1ePBgGYahRx99VIGBgd4u\n323jx4/Xn/70p2rTt8TERH3zzTdKTk6WYRiaPHmy6tevr4kTJ/p8H0eOHKkJEyZo8ODBcjqdGjdu\nnFq1alUt+nY2d34nBw0apPHjx2vw4MEKDAzUjBkzvF3+z3K5XJo6darq1aunsWPHymQy6brrrtMD\nDzzg8/0rfx7LhdSqVcvn+yeV/m5OnDhR//rXvxQWFqYZM2YoLCzsivaNufQBAPADPnFKHwAA/DoE\nPgAAfoDABwDADxD4AAD4AQIfAAA/QOADAOAHCHygmmnevLmk0ilHx44de8XaHTZsWMVy+cRRAHwH\ngQ9UM+WTlJw+fVoZGRlXrN3yWfckafHixVesXQCVwydm2gPgvr/85S/64Ycf9OCDD2rmzJlasmSJ\n5syZI8Mw1KpVKz399NMKDAxUly5d1Lp1a506dUoLFizQM888o127dunUqVOKj4/XzJkz9cILL0iS\n7r77br3//vtq3ry5MjIyVFhYqIkTJ2rnzp0ym82699571a9fPy1evFirVq3SmTNndOjQId1www2a\nNGmSTpw4oXHjxqmgoEBms1kTJ05U27ZtvfwvBfgHjvCBamrixImKiYnRzJkztXv3bi1YsEDz58/X\n4sWLFRUVpbfeektS6ZmAUaNGafHixdq8ebMCAwM1f/58ffLJJyooKNBXX32liRMnSpLef/99ST+e\nRXj55ZcVGRmppUuX6p133tErr7yi77//XlLpcy9eeeUVffDBB/riiy+0a9cuLViwQD179tTChQv1\n+OOPa+PGjV74lwH8E0f4gB9Yv369Dhw4oLvvvluGYcjhcKhVq1YV28uPsjt16qSIiAjNmzdP+/bt\n08GDB895UuWF2p06daokKTIyUjfddJM2bNig0NBQdejQoeIxpg0bNtSZM2d0/fXX68EHH1R6eroS\nExOVmprqwV4DOBuBD/gBp9OpW2+9VU899ZSk0qfjOZ1OSaVH6+UPwPn88881c+ZM3XPPPRowYMA5\njzi+kJ8+isPlcsnhcEjSeQ/VMQxDHTt21PLly/XFF1/oo48+0uLFiyvONADwLE7pA9VMeQhbrdaK\nUL/uuuv02WefKSsrq+JJf//3f/93zv6StHbtWt12223q16+foqKilJaWVtGG1WqVy+U653s6d+6s\nhQsXSpKysrL0+eefq3PnzhetbcaMGVqyZIn69eunP/3pT9q+ffsV7j2AiyHwgWqm/PP16OhoxcbG\navjw4WrevLnGjBmj4cOHq2/fvjIMQ/fff/85+0vSXXfdpaVLlyo5OVmTJk1S7969dfjwYUlSr169\ndMcdd6i4uLjie8aOHavTp0+rb9++GjZsmEaPHq0WLVpctKYhQ4bok08+Ub9+/fTAAw/omWee8ei/\nBYAf8XhcAAD8AEf4AAD4AQIfAAA/QOADAOAHCHwAAPwAgQ8AgB8g8AEA8AMEPgAAfuD/AefBODpB\nehgrAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1126b5490>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 画出每一次迭代和损失函数变化\n",
    "theta , Cost_J = gradientDescent(X, y)\n",
    "print('theta: ',theta.ravel())\n",
    "\n",
    "plt.plot(Cost_J)\n",
    "plt.ylabel('Cost J')\n",
    "plt.xlabel('Iterations');"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFkCAYAAADmPNjoAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd01FX+//HnpIdAqKGTAAlNmgUQlBIEpHcRXSwoCvgT\nV8WvDdCIKKzKqojoWnZd28qqizSVKgEEBBQF6UgJIUAKAQIJaTP398fHNEoIJJPJTF6PczhhJpOZ\n+5mck9fc+7mf99tmjDGIiIiIW/By9QBERESk6BTcIiIibkTBLSIi4kYU3CIiIm5EwS0iIuJGFNwi\nIiJuxMeZT+5wOJgyZQoHDx7Ey8uLqVOn4ufnxzPPPIOXlxdNmjQhKirKmUMQERHxKE4N7h9++AGb\nzcYXX3zBpk2beP311zHGMHHiRNq1a0dUVBQrVqygZ8+ezhyGiIiIx3DqUnnPnj2ZNm0aAEePHqVy\n5crs3LmTdu3aAdC1a1c2bNjgzCGIiIh4FKfOuAG8vLx49tlnWb58ObNmzWLdunW53wsKCuLMmTOF\n/nx6ejrbt28nJCQEb29vZw9XRETE5ex2O4mJibRq1YqAgIAC33N6cAPMmDGD//u//+O2224jIyMj\n9/7U1FSCg4ML/dnt27czatQoZw9RRESkzPn8889zV6lzODW458+fT3x8POPGjcPf3x8vLy9atWrF\npk2b6NChA2vWrKFjx46FPkdISAhgDb527drOHK6IiEiZcPz4cUaNGpWbgfk5Nbj79OnDM888w113\n3UV2djZTpkyhcePGTJkyhaysLMLDw+nTp0+hz5GzPF67dm3q16/vzOGKiIiUKRc7RezU4A4ICODN\nN9+84P5PP/3UmS8rIiLisVSARURExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiC\nW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltERMSN\nKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE\n3IiCW0RExI0ouEVERNyIgltERMSNKLhFRETciIJbRETEjSi4RURE3IiCW0RExI0ouEVERNyIgltE\nRMSNKLhFRETciIJbRETEjSi4RURE3IiPM588OzubSZMmERcXR1ZWFuPHj6dOnTqMGzeOhg0bAnDn\n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\n+apklyvZWVLvhaqMiYhcUpkreXolXF7y1AklOU/u+sN8+t4Sc8eL/zVD33rJ3Pafh8yIuePNA18/\nYRbtXm7SMs9d2RhzPPaYFbqjR1uPq1rVmL59jalUyZi5c/OO51L1xi/3WiX9Xqiut4jIRRWWfeW3\nrScUXPZ9+OG8Zd/Dh60lachbUvb2zruk6iqXx48mneWdr7cy5ot1fGPfgL3JKnxqHqG2TxDjP/uZ\nd0IGMKBZz7y2moWN8XzR0fDZZ9by9eLF1n1//au1m3ziRKvgC1y6ZWj+c94vvJB3Ljvnfcj/XuSM\noTinCkq7raqIiKdwwQeJK+KSGffFZpZVq1odxfIrYtvK3YdOmJc++skMnvphgbaaT7060myY+bSx\nhxQyk77aVYHgYGt5vKhL0cVty3klPKmxiIiIE5S5JiNlwuVKdJ6/e/qFF6xZb0iIVarUbs97fEzM\nBRvGHA7Dz7vj+d+qvew+uQvfugfwa5YCQKuazRl6TW9avfsFtqkvXnqTV2FjDAvL21yXMxMGa1XA\n29u6FOy996yZdlHKj5ZmARVVWRMRuWrlN7gvFx7n757+61+hTRvrGumMDCsc/+zKxYgR1mMGDSKr\nbj2ifznCvNV7OObYi0+dg/jXSANs3Fj/Ooak1yQ8/HrYdQDmvFN4Q47Cxnj+zuwDBwqG+qJFZTcY\nVWVNROSqld/gvlx4XKo4Sf5rpN9+G1avhsmTOTv9VZYENmXh0a2cCdiPT51D+Pll4J3toFtgBIO6\n30PdX3bBHX+G/NSpl2/IUdgYQ0MLv6ZawSgi4pHKb3AX5lLFSfbtg7lzrd7ZH38M//sfiT37s3DJ\nPpbeN5Os01vxbRyLr08W/t7+3BrRk/4nAql2x73wcGpeuDZuDG3bFn9GXNr9xEVExOXKb3AXVoDl\nYsVJ9u+3Cpjccw/Mn8/B+s34pk0/1rS6Hq96sfiErMbXy0Elv4r0b9aXWyO6Wm014eLhWhIz4tLs\nJy4iImVC+Q3uwqp3XeySqSeewKSksG3lL8zr9Ti/NgvHp84B/KqvAxuEZPsysN0Iuje6Cf+ctprg\nvHAt7/2vRUTKqfIb3FdQd9tud7B+7W7+Z67j4H1d8al7kIAq6wAIrVyXIYeh0+RZeM8bAU3yhbYz\nw1U7s0VEyqXyG9xw2XPE6RnZLN90mG+WbeeEXzy+nY/hX2kXAM33JTDkxhF5bTVbRF4YmjnhGhZm\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112548b50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "xx = np.arange(5,23)\n",
    "yy = theta[0]+theta[1]*xx\n",
    "\n",
    "# 画出我们自己写的线性回归梯度下降收敛的情况\n",
    "plt.scatter(X[:,1], y, s=30, c='r', marker='x', linewidths=1)\n",
    "plt.plot(xx,yy, label='Linear regression (Gradient descent)')\n",
    "\n",
    "# 和Scikit-learn中的线性回归对比一下 \n",
    "regr = LinearRegression()\n",
    "regr.fit(X[:,1].reshape(-1,1), y.ravel())\n",
    "plt.plot(xx, regr.intercept_+regr.coef_*xx, label='Linear regression (Scikit-learn GLM)')\n",
    "\n",
    "plt.xlim(4,24)\n",
    "plt.xlabel('Population of City in 10,000s')\n",
    "plt.ylabel('Profit in $10,000s')\n",
    "plt.legend(loc=4);"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[ 4519.7678677]\n",
      "[ 45342.45012945]\n"
     ]
    }
   ],
   "source": [
    "# 预测一下人口为35000和70000的城市的结果\n",
    "print(theta.T.dot([1, 3.5])*10000)\n",
    "print(theta.T.dot([1, 7])*10000)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
